//身份证号码的验证规则
function isIdCardNo(code) {
	let msg = "";
	const city = {
		11: "北京",
		12: "天津",
		13: "河北",
		14: "山西",
		15: "内蒙古",
		21: "辽宁",
		22: "吉林",
		23: "黑龙江 ",
		31: "上海",
		32: "江苏",
		33: "浙江",
		34: "安徽",
		35: "福建",
		36: "江西",
		37: "山东",
		41: "河南",
		42: "湖北 ",
		43: "湖南",
		44: "广东",
		45: "广西",
		46: "海南",
		50: "重庆",
		51: "四川",
		52: "贵州",
		53: "云南",
		54: "西藏 ",
		61: "陕西",
		62: "甘肃",
		63: "青海",
		64: "宁夏",
		65: "新疆",
		71: "台湾",
		81: "香港",
		82: "澳门",
		91: "国外 ",
	};
	if (code!=undefined&&code!=null&&code!='') {
		if (code.length === 18) {
			if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) {
				msg = "证件号码格式错误";
				return false;
			} else if (!city[code.substr(0, 2)]) {
				msg = "地址编码错误";
				return false;
			} else {
				// 18位身份证需要验证最后一位校验位
				code = code.split("");
				// ∑(ai×Wi)(mod 11)
				// 加权因子
				let factor = [
					7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,
				];
				// 校验位
				let parity = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2, "x"];
				let sum = 0;
				let ai = 0;
				let wi = 0;
				for (let i = 0; i < 17; i++) {
					ai = code[i];
					wi = factor[i];
					sum += ai * wi;
				}
				let last = parity[sum % 11];
				if ("" + last !== "" + code[17]) {
					msg = "证件号码校验位错误";
					return false;
				}
			}
		} else {
			msg = "证件号码长度不为18位";
			return false;
		}
	} else {
		msg = "证件号码不能为空";
		return false;
	}
	if (msg) {
		console.log(msg);
	}
	return true;
}

export {
	isIdCardNo
}